/*
 * @Author: 嵌入式王子
 * @Date: 2025-03-27 19:29:28
 * @LastEditors: 嵌入式王子
 * @LastEditTime: 2025-03-30 22:42:00
 * @FilePath: \mmo_check\oom_check.h
 * @Description: 开源的嵌入式软件包，本人不对此代码负责任
 *
 * 有问题可电邮 donminedm@163.com
 */

#ifndef _OOM_CHECK_H_
#define _OOM_CHECK_H_

#include <stdint.h>
#include <string.h> //strrchr()函数所需头文件

// windows:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN64)
#define filename(x) strrchr(x, '\\') ? strrchr(x, '\\') + 1 : x
// linux :
#else
// #define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
#endif

typedef enum
{
    OOM_OK = 0,
    OOM_MALLOC_ERR,
    OOM_NULL,
    OOM_FREE_ERR,
    OOM_RES_MAX = 255
} OOM_RES;

//节点最大数
#define OOM_NODE_MAX 32   
//节点保存指针最大数
#define OOM_NODE_PTR_MAX 32

typedef struct oom_node_ptr
{
    uint16_t row;  // 当前行数
    uint16_t size; // 当前大小
    uint32_t ptr;  // 当前地址
} OOM_NODE_PTR;

typedef enum oom_warn
{

}OOM_WARN;

typedef struct oom_node
{
    OOM_WARN warn;
    char *file_name;                         // 文件名称
    uint32_t malloc_cnt;                     // 申请次数
    uint32_t free_cnt;                       // 释放次数
    uint32_t use_mem;                        // 当前占用的内存
    uint16_t ptr_next;                       // 指针列表当前项
    OOM_NODE_PTR ptr_list[OOM_NODE_PTR_MAX]; // 当前使用的指针列表
} OOM_NODE;

/**
 * @description:暴露申请函数，获取当前申请的文件名及行数大小
 * @return {*}
 */
#define oom_malloc(len) __oom_malloc(filename(__FILE__), __LINE__, len)

/**
 * @description:内存拷贝
 * @param {uint16_t} size
 * @return {*}
 */
void *__oom_malloc(char *file_name, uint16_t row, uint16_t len);

/**
 * @description:暴露释放函数，获取当前释放的文件名及行数及指针
 * @return {*}
 */
#define oom_free(ptr) __oom_free(filename(__FILE__), __LINE__, ptr)

/**
 * @description:内存释放
 * @param {void} *ptr
 * @return {*}
 */
OOM_RES __oom_free(char *file_name, uint16_t row, void *ptr);

/**
 * @description: 打印当前动态内存使用详情
 * @return {*}
 */
void oom_printf(void);

/**
 * @description: 获取当前文件使用的内存大小
 * @param {char} *filename
 * @return {*}
 */
uint32_t oom_node_use(const char *filename);

/**
 * @description: 获取当前文件节点
 * @param {char} *filename
 * @return {*}
 */
OOM_NODE *oom_node_get(const char *filename);

#endif